package org.hank.demoproject

import org.junit.Test

//  ┏┓　　　┏┓
//┏┛┻━━━┛┻┓
//┃　　　　　　　┃
//┃　　　━　　　┃
//┃　┳┛　┗┳　┃
//┃　　　　　　　┃
//┃　　　┻　　　┃
//┃　　　　　　　┃
//┗━┓　　　┏━┛
//    ┃　　　┃                  神兽保佑
//    ┃　　　┃                  永无BUG！
//    ┃　　　┗━━━┓
//    ┃　　　　　　　┣┓
//    ┃　　　　　　　┏┛
//    ┗┓┓┏━┳┓┏┛
//      ┃┫┫　┃┫┫
//      ┗┻┛　┗┻┛
/**
 *@auth: Hank
 *邮箱: cs16xiaoc1@163.com
 *创建时间: 2021/9/9 17:18
 *描述: 查找字符串中最长的回文字符串
 */
class LongestPalindrome {

    fun getLongest(inputStr: String): String? {
        val len: Int = inputStr.length
        if (len < 2) {
            return inputStr
        }
        val str = addBoundaries(inputStr, '#')
        val sLen = 2 * len + 1
        var maxLen = 1

        var start = 0
        for (i in 0 until sLen) {
            val curLen = centerSpread(str, i)
            if (curLen > maxLen) {
                maxLen = curLen
                start = (i - maxLen) / 2
            }
        }
        return inputStr.substring(start, start + maxLen)
    }

    fun centerSpread(s:String,center:Int):Int{
        val len: Int = s.length
        var i: Int = center - 1
        var j: Int = center + 1
        var step = 0
        while (i >= 0 && j < len && s[i] == s[j]) {
            i--
            j++
            step++
        }
        return step
    }

    fun addBoundaries(inputString: String, boundDivide: Char): String {
        if(inputString.isEmpty())
            return ""
        if(inputString.indexOf(boundDivide) != -1)
            throw IllegalArgumentException("输入错误，分割字符串在源字符串中已存在")
        var sb = StringBuilder()
        for (item in inputString){
            sb.append(boundDivide)
            sb.append(item)
        }
        sb.append(boundDivide)
        return sb.toString()
    }

    @Test
    fun main(){
        System.out.println(getLongest("abcdefg"))
    }
}